package com.qige.homework;

import java.io.*;

/**
 * @Author qige
 * @Date 2024-08-06 20:29
 * @Description
 */
public class homework7 {
    /*
    4.复制文件夹d:/huayujava下面所有文件和子文件夹内容到d:/huayujava2。
    提示：涉及单个文件复制、目录的创建、递归的使用
     */
    public static void main(String[] args) {
        File sourceFile = new File("E:\\软帝\\day10-IO流\\代码\\day10-code");
        File destFile = new File("E:\\软帝\\day10-IO流\\代码\\day10");
        try {
            copyDir(sourceFile, destFile);
        } catch (FileNotFoundException e) {
            throw new RuntimeException(e);
        }
    }
    public static void copyDir(File sourceFile, File destFile) throws FileNotFoundException {
        // 1.判断源文件是否存在
        if(!sourceFile.exists()) {
            throw new FileNotFoundException("源文件夹不存在！");
        }
        // 2.如果目标文件不存在，则新建目标文件夹
        if(!destFile.exists()) {
            destFile.mkdirs();
        }
        // 3.获取源文件夹中所有的子文件(包含文件和文件夹)
        File[] files = sourceFile.listFiles();
        for(File file : files) {
            // 3.1如果是文件，则直接复制文件即可
            if(file.isFile()) {
                // 执行拷贝文件操作
                copyFile(file, new File(destFile, file.getName()));
            }
            // 3.2如果是文件夹，则递归调用
            else {
                copyDir(file, new File(destFile, file.getName()));
            }
        }
    }
    public static void copyFile(File sourceFile, File destFile) {
        BufferedInputStream bis = null;
        BufferedOutputStream bos = null;
        try {
            // 1.文件输入流
            FileInputStream fis = new FileInputStream(sourceFile);
            bis = new BufferedInputStream(fis);
            // 2.文件输出流
            FileOutputStream fos = new FileOutputStream(destFile);
            bos = new BufferedOutputStream(fos);
            // 3.读取数据
            byte[] by = new byte[1024];
            int len = 0;
            while((len = bis.read(by)) != -1) {
                // 4.写入数据
                bos.write(by, 0, len);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if(bos != null) {
                try {
                    bos.close(); // 关闭输出流
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(bis != null) {
                try {
                    bis.close(); // 关闭输入流
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
